package com.lonely.fx.image;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;
import java.net.URL;

/**
 * @date: 2022-07-26 10:27
 * @author: ztkj-hzb
 * @description: Image类的使用
 **/
public class ImageSettingMain extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    /**
     * 1. Image是个类，不属于Node，因此需要依托 ImageView组件才可以显示
     */
    @Override
    public void start(Stage primaryStage) throws Exception {

        HBox hBox = new HBox();

        //使用绝对路径,比如磁盘路径,注意这里要传入的是一个url，如果是本地路径，需要添加 file:路径
        //Image image = new Image("file:C:\\Users\\汪娇\\Pictures\\Saved Pictures\\mla.png");

        //使用相对路径
        //Image image = new Image("icons/mla.png");

        //通过 getClassLoader
        //Image image = new Image(getClass().getClassLoader().getResource("icons/mla.png").toExternalForm());

        //通过 Resource
        //Image image = new Image(getClass().getResource("/icons/mla.png").toExternalForm());

        //使用输入流
        //Image image = new Image(new URL("https://www.haoy99.com/FileUpload/2019-02/Shui1Zhu11i1Pao1pptB-173234_109.jpg").openStream());

        String path = "icons/welcome.jpg";

        //设置图片异步加载,用于加载 大图片的使用
        /*Image image = new Image(path, true);

        //显示异步图片加载进度
        image.progressProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                System.out.println("图片加载进度：" + newValue);
            }
        });*/

        //如果要演示 错误异常展示，不能使用相对路径，则使用这种方式， 且 需要配置 异步加载图片：true
        //path ="file:C:\\Users\\汪娇\\Pictures\\Saved Pictures\\mla2.png";

        //设置图片的加载到内存的宽高
        Image image = new Image(path, 300, 300, true, true);

        //设置同比例缩放 presesrveRatio ，如果为true，则 宽高同步里缩放，如果先设置宽，则高度计算按比例缩放，同理，先设置高，则宽度同步里缩放

        //获取真是的宽和高，当设置了比例缩放后，则该值就可能与 requestWidth的值不同了
        System.out.println(image.getWidth());
        System.out.println(image.getHeight());

        //获取构造方法里设置的宽高
        System.out.println(image.getRequestedWidth());
        System.out.println(image.getRequestedHeight());

        //设置 指示在缩放此图像以适合指定边界框时是使用质量更好的过滤算法还是使用更快的过滤算法
        //true:质量更好，不过一般看不出来效果
        System.out.println(image.isSmooth());

        //监听错误触发---想要触发，前提是开启异步加载
        image.errorProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                System.out.println("是否异常：" + newValue);
            }
        });

        //监听异常触发---想要触发，前提是开启异步加载
        image.exceptionProperty().addListener(new ChangeListener<Exception>() {
            @Override
            public void changed(ObservableValue<? extends Exception> observable, Exception oldValue, Exception newValue) {
                System.out.println("异常消息" + newValue.getMessage());
            }
        });

        ImageView imageView = new ImageView(image);
        hBox.getChildren().addAll(imageView);
        primaryStage.setScene(new Scene(hBox));
        primaryStage.setWidth(600);
        primaryStage.setHeight(500);
        primaryStage.show();
    }
}
